#pragma once
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
#include"Util.hpp"
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>

const std::string sep = "\r\n";
const std::string default_root = "wwwroot";//web根目录！
const std::string home_page = "index.html";
const std::string html_404 = "wwwroot/404.html";

class HttpRequest
{
public:
    HttpRequest(){}
    ~HttpRequest(){}

    void parse()
    {
        //1.从inbuffer中获取第一行！分隔符 \r\n
        std::string line = Util::getOneLine(inbuffer,sep);
        if(line.empty()) return;
        std::cout << "line:" << line << std::endl;
        //2.从请求行中提取三个字段！
        std::stringstream ss(line);//这个支持根据空格自动分割！
        ss >> method >> url >> httpversion;


        //a/b/c.py?name=zhangsan&pwd=12345
        // 2.1 根据？将左右两边分离
        //如果是POST则本身就是分离的！
        //左边就是PATH，右边就是参数！


        //3.添加web默认路径！
        path = default_root;//./wwwroot
        path += url;//拼接后就变成了 ./wwwroot/a/b/c.html
        //以后我们访问的资源都是从 ./wwwroot开始进行访问！
        //如果url 是一个 / 那么拼接后就变成了 ./wwwroot/
        //那么这样子不就糟糕了！我们要访问哪一个文件资源？
        //其实每一个服务器都有自己的主页信息 home_page——一般所有的web服务器默认都有一个index.html
        //这个index.html都会被放在wwwroot的一级目录下,为了如果是一个 /那么就默认把首页拼上去！
        //那么我们该如何判断是一个 / 呢？
        if(path[path.size() -1] == '/') path +=home_page;


        //4. 获取path对应的资源的后缀
        //  ./wwwroot/index.html
        // ./wwwroot/test/a.html
        auto pos = path.rfind(".");//找到这个点就说明找到后缀了！
        if(pos == std::string::npos) suffix = ".html";
        else suffix = path.substr(pos);


        //5.得到资源的大小！
        struct stat status;
        int n = stat(path.c_str(),&status);
        if(n == 0) size = status.st_size;
        else size = -1;

    }

public:
    std::string inbuffer;//协议请求都是在inbuffer里面！
    // std::string reqline;//请求行
    // std::vector<std::string> reqheader;//请求报头
    // std::string body;//正文！

    std::string method;
    std::string url;
    std::string httpversion;
    std::string path;//请求路径
    std::string suffix;//资源后缀
    int size;//正文的大小！
    std::string parm;
};




class HttpResponse
{
public:
    std::string outbuffer;
};